<?php

namespace abstractFactoryPattern;

/**
 * 抽象工厂模式的角色和职责
 * 1. 抽象工厂(AbstractFactory)：声明一组创建产品的方法
 * 2. 具体工厂(ConcreteFactory)：实现创建具体产品的方法
 * 3. 抽象产品(AbstractProduct)：定义每个产品的公共接口
 * 4. 具体产品(ConcreteProduct)：实现具体的产品对象
 */

// 以"多平台 UI 渲染"为例，我们用抽象工厂模式实现一个简单的组件系统。

// 1. 定义抽象产品接口：声明各类UI组件的标准接口
interface Button
{
    public function render(): void;
}

interface TextBox
{
    public function render(): void;
}

interface Image
{
    public function render(): void;
}

// 2. 定义抽象工厂接口，同意创建产品族的工厂接口
interface UIFactory
{
    public function createButton(): Button;
    public function createTextBox(): TextBox;
    public function createImage(): Image;
}

// 3. 产品和工厂的实现
// web组件实现
// ==========================开始
class WebButton implements Button
{
    public function render(): void
    {
        echo "渲染web风格的按钮 \n";
    }
}

class WebTextBox implements TextBox
{
    public function render(): void
    {
        echo "渲染web风格的文本框 \n";
    }
}

class WebImage implements Image
{
    public function render(): void
    {
        echo "渲染web风格的图片 \n";
    }
}
// web工厂的实现
class WebUIFactory implements UIFactory
{
    public function createButton(): Button
    {
        return new WebButton();
    }
    public function createTextBox(): TextBox
    {
        return new WebTextBox();
    }

    public function createImage(): Image
    {
        return new WebImage();
    }
}
// ==========================结束

// 安卓组件实现
// ==========================开始
// 安卓产品实现
class AndroidButton implements Button
{
    public function render(): void
    {
        echo "渲染安卓风格的按钮 \n";
    }
}
class AndroidTextBox implements TextBox
{
    public function render(): void
    {
        echo "渲染安卓风格的文本框 \n";
    }
}
class AndroidImage implements Image
{
    public function render(): void
    {
        echo "渲染安卓风格的图片 \n";
    }
}
// 安卓工厂实现
class AndroidUIFactory implements UIFactory
{
    public function createButton(): Button
    {
        return new AndroidButton();
    }
    public function createTextBox(): TextBox
    {
        return new AndroidTextBox();
    }

    public function createImage(): Image
    {
        return new AndroidImage();
    }
}
// ==========================结束

// 测试
// 当前运行环境为web
echo "当前运行环境为web\n";
$webUIFactory = new WebUIFactory();
$webUIFactory->createButton()->render();
$webUIFactory->createTextBox()->render();
$webUIFactory->createImage()->render();
// 当前运行环境为安卓
echo "分割线==========================分割线\n";
echo "当前运行环境为安卓\n";
$androidUIFactory = new AndroidUIFactory();
$androidUIFactory->createButton()->render();
$androidUIFactory->createTextBox()->render();
$androidUIFactory->createImage()->render();